package top.dotgo.kit.oss;

import cn.hutool.core.date.DatePattern;
import cn.hutool.core.date.DateUtil;
import cn.hutool.core.util.StrUtil;
import com.aliyun.oss.ClientException;
import com.aliyun.oss.OSSException;

import java.io.ByteArrayInputStream;
import java.io.File;
import java.io.FileInputStream;
import java.io.FileNotFoundException;

/**
 * @author : lin
 * @date : 2019/03/03 13:19
 * @description :
 * oss 文件上传工具包
 */
public class OssPutKti extends OssBaseKit {

    private static OssPutKti ossKit;

    private OssPutKti() {
    }

    public static OssPutKti get() {
        initClient();
        if (ossKit == null) {
            synchronized (OssPutKti.class) {
                if (ossKit == null) {
                    ossKit = new OssPutKti();
                }
            }
        }
        return ossKit;
    }

    public static String getFileKey(String path, String suffix) {
        //获取文件后缀
        if (!StrUtil.isEmpty(suffix)) {
            int index = suffix.lastIndexOf(StrUtil.DOT);
            if (index > 0) {
                suffix = suffix.substring(index);
            }
        }
        if (!suffix.startsWith(StrUtil.DOT)) {
            suffix = ".png";
        }

        return StrUtil.format("{}/{}{}{}", StrUtil.removePrefix(path, "/"), DateUtil.date().toString(DatePattern.PURE_DATETIME_PATTERN), StrUtil.uuid(), suffix);
    }

    /**
     * 创建一个文件夹
     *
     * @param fullPath 文件夹的绝对路径
     *                 如：现有一个文件夹 user，要在user下创建123文件夹
     *                 则： fullPath=user/123
     * @return boolean
     */
    public boolean createFolder(String fullPath) {
        try {
            // 上传
            ossClient.putObject(BUCKET, fullPath, new ByteArrayInputStream(new byte[0]));
            return true;
        } catch (OSSException | ClientException e) {
            e.printStackTrace();
        } finally {
            // 关闭client
            ossClient.shutdown();

        }
        return false;
    }

    /**
     * 将byte[] 上传至oss
     *
     * @param bytes byte[] bytes
     * @param key   文件的key （如果上传oss中指定文件夹内，请指定）
     *              如：user/123/headPic.png
     * @return 是否成功
     */
    public boolean putBytes(byte[] bytes, String key) {
        try {
            // 上传
            ossClient.putObject(BUCKET, key, new ByteArrayInputStream(bytes));
            return true;
        } catch (OSSException | ClientException e) {
            e.printStackTrace();
        } finally {
            // 关闭client
            ossClient.shutdown();

        }
        return false;
    }

    /**
     * 将文本上传到oss中
     *
     * @param str 文本内容
     * @param key 文件的key （如果上传oss中指定文件夹内，请指定）
     *            如：user/123/headPic.png
     * @return 是否成功
     */
    public boolean putString(String str, String key) {
        return putBytes(str.getBytes(), key);
    }

    /**
     * 通过文件流上传文件
     *
     * @param stream 文件流
     * @param key    文件的key （如果上传oss中指定文件夹内，请指定）
     *               如：user/123/headPic.png
     * @return 是否成功
     */
    public boolean putFile(FileInputStream stream, String key) {

        try {
            // 上传文件流
            ossClient.putObject(BUCKET, key, stream);
            return true;
        } catch (OSSException | ClientException e) {
            e.printStackTrace();
        } finally {
            // 关闭client
            ossClient.shutdown();

        }
        return false;

    }

    /**
     * 通过文件上传
     *
     * @param file 文件
     * @param key  文件的key （如果上传oss中指定文件夹内，请指定）
     *             如：user/123/headPic.png
     * @return 是否成功
     */
    public boolean putFile(File file, String key) {
        try {
            return putFile(new FileInputStream(file), key);
        } catch (FileNotFoundException e) {
            e.printStackTrace();
        }
        return false;
    }

    /**
     * 通过文件路径上传文件
     *
     * @param filePath 文件路径（包含文件名）
     * @param key      文件的key （如果上传oss中指定文件夹内，请指定）
     *                 如：user/123/headPic.png
     * @return 是否成功
     */
    public boolean putFile(String filePath, String key) {
        return putFile(new File(filePath), key);
    }

    /**
     * 判断路径是否存在
     *
     * @param filePath filePath
     * @return boolean
     */
    public boolean isExist(String filePath) {
        // 判断文件是否存在。
        boolean found = ossClient.doesObjectExist(BUCKET, filePath);
        // 关闭OSSClient。
        ossClient.shutdown();
        return found;
    }

}
